home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ML_3DROT.ZIP / SOURCES / ENGINE3D.ASM next >
Assembly Source File  |  1996-05-04  |  9KB  |  263 lines

  1. COMMENT $
  2.   ----- Engine 3D -----
  3.   3D to 2D mapping routine, by Maple Leaf - 1996
  4.   last update: 4th May 1996 (speedups)
  5. $
  6.  
  7. .386c
  8.  
  9. DATA  segment  word public use16
  10.       extrn    RotAngle:WORD
  11.       extrn    TiltAngle:WORD
  12.       extrn    Xt, Yt, Zt : DWORD
  13.       extrn    _3DX, _3DY, _3DZ : DWORD
  14.       extrn    _2DX, _2DY : DWORD
  15.       extrn    CenterX, CenterY : DWORD
  16.       extrn    SinTab:BYTE
  17.       extrn    CosTab:BYTE
  18.       extrn    ObserverX, ObserverY, ObserverDist : DWORD
  19.       extrn    TmpEqu:DWORD
  20.       extrn    Perspective:BYTE
  21.       extrn    ZoomFactor:WORD
  22.       extrn    CameraX, CameraY, CameraZ : DWORD
  23. DATA  ends
  24.  
  25. CODE  segment  byte public use16
  26.       assume   ds:DATA,cs:CODE
  27.  
  28.       public   IntMapCoordinates
  29.       public   IntMapCoordinates2
  30.  
  31. ;*****************************************************************************
  32.  
  33. IntMapCoordinates proc far
  34.     mov     si,RotAngle
  35.     mov     di,TiltAngle
  36.     shl     si,2
  37.     shl     di,2
  38.     ; ----- _3dx:=_3dx-CameraX -----
  39.     mov     eax,dword ptr _3DX
  40.     sub     eax,dword ptr CameraX
  41.     mov     dword ptr _3DX,eax
  42.     ; ----- _3dy:=_3dy-CameraY -----
  43.     mov     eax,dword ptr _3DY
  44.     sub     eax,dword ptr CameraY
  45.     mov     dword ptr _3DY,eax
  46.     ; ----- _3dz:=_3dz-CameraZ -----
  47.     mov     eax,dword ptr _3DZ
  48.     sub     eax,dword ptr CameraZ
  49.     mov     dword ptr _3DZ,eax
  50.     ; ----- Xt:=ObserverX+_3DX*CosA-_3DY*SinA -----
  51.     mov     eax,dword ptr _3DY
  52.     imul    dword ptr SinTab[si]
  53.     mov     ebx,eax
  54.     mov     eax,dword ptr _3DX
  55.     imul    dword ptr CosTab[si]
  56.     sub     eax,ebx
  57.     mov     ebx,dword ptr ObserverX
  58.     sal     ebx,8
  59.     add     eax,ebx
  60.     sar     eax,8
  61.     mov     dword ptr Xt,eax
  62.     ; -- Yt:= ObserverY + (_3DX*SinA + _3DY*CosA)*SinB + _3DZ*CosB; --
  63.     mov     eax,dword ptr _3DX
  64.     imul    dword ptr SinTab[si]
  65.     mov     ebx,eax
  66.     mov     eax,dword ptr _3DY
  67.     imul    dword ptr CosTab[si]
  68.     add     eax,ebx
  69.     sar     eax,8
  70.     mov     dword ptr TmpEqu,eax
  71.     imul    dword ptr SinTab[di]
  72.     mov     ebx,eax
  73.     mov     eax,dword ptr _3DZ
  74.     imul    dword ptr CosTab[di]
  75.     add     eax,ebx
  76.     mov     ebx,dword ptr ObserverY
  77.     sal     ebx,8
  78.     add     eax,ebx
  79.     sar     eax,8
  80.     mov     dword ptr Yt,eax
  81.     ; --- if perspective then begin ---
  82.     cmp     Perspective,1           ; Want perspective ? If yes, then another
  83.     jne     @NoPerspective    ; 6 more IMUL instructions will appear ... (half speed) - I really don't know how to optimize this shit ...  ;=)  f#$%^&* !!!
  84.     ; --- Zt:=ObserverDist+(_3DX*SinA+_3DY*CosA)*CosB-(_3DZ*SinB); ---
  85.     mov     eax,TmpEqu
  86.     imul    dword ptr CosTab[di]
  87.     mov     ebx,eax
  88.     mov     eax,dword ptr _3DZ        ;<--; This could be erased if ya want
  89.     imul    dword ptr SinTab[di]      ;   ; more speed, but some parts of the perspective will be lost ...
  90.     sub     ebx,eax                   ;<--; (e.g. One running-point)
  91.     mov     eax,dword ptr ObserverDist
  92.     sal     eax,8
  93.     add     eax,ebx
  94.     sar     eax,8
  95.     jnz     short @@1
  96.     mov     eax,1     ; To prevent division by 0 ...
  97. @@1:mov     dword ptr Zt,eax
  98.     ; ---- _2DX:=CenterX+Trunc(Xt*ZoomFactor/Zt); ----
  99.     mov     eax,dword ptr Xt
  100.     imul    dword ptr ZoomFactor
  101.     idiv    dword ptr Zt
  102.     add     eax,dword ptr CenterX
  103.     mov     dword ptr _2DX,eax
  104.     ; ---- _2DY:=CenterY-Trunc(Yt*ZoomFactor/Zt*13/16); ----
  105.     mov     eax,dword ptr Yt
  106.     imul    dword ptr ZoomFactor
  107.     idiv    dword ptr Zt
  108.     ;
  109.     add     eax,eax      ; This part is the equivalent of:
  110.     mov     ebx,eax      ; -----------
  111.     add     eax,eax      ; mov ecx,13
  112.     add     ebx,eax      ; imul ecx
  113.     add     eax,eax      ; -----------
  114.     add     eax,ebx      ;
  115.     ;
  116.     sar     eax,4
  117.     mov     ebx,dword ptr CenterY
  118.     sub     ebx,eax
  119.     mov     dword ptr _2DY,ebx
  120.     jmp     short @Outta
  121. @NoPerspective:
  122.     ; ---- _2DX:=CenterX+Trunc(Xt); ----
  123.     mov     eax,dword ptr Xt
  124.     add     eax,dword ptr CenterX
  125.     mov     dword ptr _2DX,eax
  126.     ; ---- _2DY:=CenterY-Trunc(Yt*13/16); ----
  127.     mov     eax,dword ptr Yt
  128.     ;
  129.     add     eax,eax      ; This part is the equivalent of:
  130.     mov     ebx,eax      ; -----------
  131.     add     eax,eax      ; mov ecx,13
  132.     add     ebx,eax      ; imul ecx
  133.     add     eax,eax      ; -----------
  134.     add     eax,ebx      ;
  135.     ;
  136.     sar     eax,4
  137.     mov     ebx,dword ptr CenterY
  138.     sub     ebx,eax
  139.     mov     dword ptr _2DY,ebx
  140. @Outta:
  141.     retf
  142. IntMapCoordinates endp
  143.  
  144. ;*****************************************************************************
  145.  
  146. IntMapCoordinates2 proc far
  147.     mov     si,RotAngle
  148.     mov     di,TiltAngle
  149.     shl     si,2
  150.     shl     di,2
  151.     ; ----- _3dx:=_3dx-CameraX -----
  152.     mov     eax,dword ptr _3DX
  153.     sub     eax,dword ptr CameraX
  154.     mov     dword ptr _3DX,eax
  155.     ; ----- _3dy:=_3dy-CameraY -----
  156.     mov     eax,dword ptr _3DY
  157.     sub     eax,dword ptr CameraY
  158.     mov     dword ptr _3DY,eax
  159.     ; ----- _3dz:=_3dz-CameraZ -----
  160.     mov     eax,dword ptr _3DZ
  161.     sub     eax,dword ptr CameraZ
  162.     mov     dword ptr _3DZ,eax
  163.     ; ----- Xt:=ObserverX+_3DX*CosA-_3DY*SinA -----
  164.     mov     eax,dword ptr _3DY
  165.     imul    dword ptr SinTab[si]
  166.     mov     ebx,eax
  167.     mov     eax,dword ptr _3DX
  168.     imul    dword ptr CosTab[si]
  169.     sub     eax,ebx
  170.     mov     ebx,dword ptr ObserverX
  171.     sal     ebx,8
  172.     add     eax,ebx
  173.     sar     eax,8
  174.     mov     dword ptr Xt,eax
  175.     ; -- Yt:= ObserverY + (_3DX*SinA + _3DY*CosA)*SinB + _3DZ*CosB; --
  176.     mov     eax,dword ptr _3DX
  177.     imul    dword ptr SinTab[si]
  178.     mov     ebx,eax
  179.     mov     eax,dword ptr _3DY
  180.     imul    dword ptr CosTab[si]
  181.     add     eax,ebx
  182.     sar     eax,8
  183.     mov     dword ptr TmpEqu,eax
  184.     imul    dword ptr SinTab[di]
  185.     mov     ebx,eax
  186.     mov     eax,dword ptr _3DZ
  187.     imul    dword ptr CosTab[di]
  188.     add     eax,ebx
  189.     mov     ebx,dword ptr ObserverY
  190.     sal     ebx,8
  191.     add     eax,ebx
  192.     sar     eax,8
  193.     mov     dword ptr Yt,eax
  194.     ; --- if perspective then begin ---
  195.     cmp     Perspective,1           ; Want perspective ? If yes, then another
  196.     jne     @NoPerspective2   ; 6 more IMUL instructions will appear ... (half speed) - I really don't know how to optimize this shit ...  ;=)  f#$%^&* !!!
  197.     ; --- Zt:=ObserverDist+(_3DX*SinA+_3DY*CosA)*CosB-(_3DZ*SinB); ---
  198.     mov     eax,TmpEqu
  199.     imul    dword ptr CosTab[di]
  200.     mov     ebx,eax
  201.     mov     eax,dword ptr _3DZ        ;<--; This could be erased if ya want
  202.     imul    dword ptr SinTab[di]      ;   ; more speed, but some parts of the perspective will be lost...
  203.     sub     ebx,eax                   ;<--; (e.g. One running-point)
  204.     mov     eax,dword ptr ObserverDist
  205.     sal     eax,8
  206.     add     eax,ebx
  207.     sar     eax,8
  208.     jnz     short @@2
  209.     mov     eax,1     ; To prevent division by 0 ...
  210. @@2:mov     dword ptr Zt,eax
  211.     ; ---- _2DX:=CenterX+Trunc(Xt*ZoomFactor/Zt); ----
  212.     mov     eax,dword ptr Xt
  213. ;    imul    dword ptr ZoomFactor
  214.     cdq
  215.     shl     eax,8   ; ZoomFactor is 256 by default
  216.     idiv    dword ptr Zt
  217.     add     eax,dword ptr CenterX
  218.     mov     dword ptr _2DX,eax
  219.     ; ---- _2DY:=CenterY-Trunc(Yt*ZoomFactor/Zt*13/16); ----
  220.     mov     eax,dword ptr Yt
  221. ;    imul    dword ptr ZoomFactor
  222.     cdq
  223.     shl     eax,8   ; ZoomFactor is 256 by default
  224.     idiv    dword ptr Zt
  225.     ;
  226.     add     eax,eax      ; This part is the equivalent of:
  227.     mov     ebx,eax      ; -----------
  228.     add     eax,eax      ; mov ecx,13
  229.     add     ebx,eax      ; imul ecx
  230.     add     eax,eax      ; -----------
  231.     add     eax,ebx      ;
  232.     ;
  233.     sar     eax,4
  234.     mov     ebx,dword ptr CenterY
  235.     sub     ebx,eax
  236.     mov     dword ptr _2DY,ebx
  237.     jmp     short @Outta2
  238. @NoPerspective2:
  239.     ; ---- _2DX:=CenterX+Trunc(Xt); ----
  240.     mov     eax,dword ptr Xt
  241.     add     eax,dword ptr CenterX
  242.     mov     dword ptr _2DX,eax
  243.     ; ---- _2DY:=CenterY-Trunc(Yt*13/16); ----
  244.     mov     eax,dword ptr Yt
  245.     ;
  246.     add     eax,eax      ; This part is the equivalent of:
  247.     mov     ebx,eax      ; -----------
  248.     add     eax,eax      ; mov ecx,13
  249.     add     ebx,eax      ; imul ecx
  250.     add     eax,eax      ; -----------
  251.     add     eax,ebx      ;
  252.     ;
  253.     sar     eax,4
  254.     mov     ebx,dword ptr CenterY
  255.     sub     ebx,eax
  256.     mov     dword ptr _2DY,ebx
  257. @Outta2:
  258.     retf
  259. IntMapCoordinates2 endp
  260.  
  261. CODE  ends
  262.       end
  263.